This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(Seurat)
Loading required package: SeuratObject
Loading required package: sp
‘SeuratObject’ was built under R 4.2.0 but the current version is 4.2.2; it is recomended that you
reinstall ‘SeuratObject’ as the ABI for R may have changed

Attaching package: ‘SeuratObject’

The following object is masked from ‘package:base’:

    intersect

Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(patchwork)

# Load the PBMC dataset
pbmc.data <- Read10X(data.dir = "/Users/surangijayasinghe/filtered_gene_bc_matrices 2/hg19/")
# Initialize the Seurat object with the raw (non-normalized data).
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
Warning: Feature names cannot have underscores ('_'), replacing with dashes ('-')
pbmc
An object of class Seurat 
13714 features across 2700 samples within 1 assay 
Active assay: RNA (13714 features, 0 variable features)
 1 layer present: counts

The number of unique genes detected in each cell. Low-quality cells or empty droplets will often have very few genes Cell doublets or multiplets may exhibit an aberrantly high gene count Similarly, the total number of molecules detected within a cell (correlates strongly with unique genes) The percentage of reads that map to the mitochondrial genome Low-quality / dying cells often exhibit extensive mitochondrial contamination We calculate mitochondrial QC metrics with the PercentageFeatureSet() function, which calculates the percentage of counts originating from a set of features We use the set of all genes starting with MT- as a set of mitochondrial genes

# The [[ operator can add columns to object metadata. This is a great place to stash QC stats
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

In the example below, we visualize QC metrics, and use these to filter cells.

We filter cells that have unique feature counts over 2,500 or less than 200 We filter cells that have >5% mitochondrial counts

# Visualize QC metrics as a violin plot
VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.

# FeatureScatter is typically used to visualize feature-feature relationships, but can be used
# for anything calculated by the object, i.e. columns in object metadata, PC scores etc.

plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2

pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

#Next Normalize the data! After After removing unwanted cells from the dataset, the next step is to normalize the data. #Global-scaling normalization method “LogNormalize” that normalizes the feature expression measurements for each cell by the total expression, multiplies this by a scale factor (10,000 by default), and log-transforms the result. In Seurat v5, Normalized values are stored in pbmc[[“RNA”]]$data.

pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
Normalizing layer: counts
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

#provideds the default values for parameters in the function call.However may not be needed, and can just use the function below

pbmc <- NormalizeData(pbmc)
Normalizing layer: counts
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Identification of highly variable features (feature selection) Next calculate a subset of features that exhibit high cell-to-cell variation in the dataset (i.e, they are highly expressed in some cells, and lowly expressed in others). genes in downstream analysis helps to highlight biological signal in single-cell datasets. #models the mean -variabce relationship in single cell data

pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
Finding variable features for layer counts
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
# Identify the 10 most highly variable genes
top10 <- head(VariableFeatures(pbmc), 10)

# plot variable features with and without labels
plot1 <- VariableFeaturePlot(pbmc)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
plot1 + plot2

#Scaling the data #Next, we apply a linear transformation (‘scaling’) that is a standard pre-processing step prior to dimensional reduction techniques like PCA. The ScaleData() function:

#Shifts the expression of each gene, so that the mean expression across cells is 0 #Scales the expression of each gene, so that the variance across cells is 1 #This step gives equal weight in downstream analyses, so that highly-expressed genes do not dominate #The results of this are stored in pbmc[[“RNA”]]$scale.data #By default, only variable features are scaled. #You can specify the features argument to scale additional features

all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)
Centering and scaling data matrix

  |                                                                                                            
  |                                                                                                      |   0%
  |                                                                                                            
  |=======                                                                                               |   7%
  |                                                                                                            
  |===============                                                                                       |  14%
  |                                                                                                            
  |======================                                                                                |  21%
  |                                                                                                            
  |=============================                                                                         |  29%
  |                                                                                                            
  |====================================                                                                  |  36%
  |                                                                                                            
  |============================================                                                          |  43%
  |                                                                                                            
  |===================================================                                                   |  50%
  |                                                                                                            
  |==========================================================                                            |  57%
  |                                                                                                            
  |==================================================================                                    |  64%
  |                                                                                                            
  |=========================================================================                             |  71%
  |                                                                                                            
  |================================================================================                      |  79%
  |                                                                                                            
  |=======================================================================================               |  86%
  |                                                                                                            
  |===============================================================================================       |  93%
  |                                                                                                            
  |======================================================================================================| 100%

#Perform linear dimensional reduction #Next we perform PCA on the scaled data. By default, only the previously determined variable features are used as input, but can be defined using features argument if you wish to choose a different subset (if you do want to use a custom subset of features, make sure you pass these to ScaleData first).

#For the first principal components, Seurat outputs a list of genes with the most positive and negative loadings, representing modules of genes that exhibit either correlation (or anti-correlation) across single-cells in the dataset.

pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
PC_ 1 
Positive:  CST3, TYROBP, LST1, AIF1, FTL, FTH1, LYZ, FCN1, S100A9, TYMP 
       FCER1G, CFD, LGALS1, S100A8, CTSS, LGALS2, SERPINA1, IFITM3, SPI1, CFP 
       PSAP, IFI30, SAT1, COTL1, S100A11, NPC2, GRN, LGALS3, GSTP1, PYCARD 
Negative:  MALAT1, LTB, IL32, IL7R, CD2, B2M, ACAP1, CD27, STK17A, CTSW 
       CD247, GIMAP5, AQP3, CCL5, SELL, TRAF3IP3, GZMA, MAL, CST7, ITM2A 
       MYC, GIMAP7, HOPX, BEX2, LDLRAP1, GZMK, ETS1, ZAP70, TNFAIP8, RIC3 
PC_ 2 
Positive:  CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1, HLA-DRA, LINC00926, CD79B, HLA-DRB1, CD74 
       HLA-DMA, HLA-DPB1, HLA-DQA2, CD37, HLA-DRB5, HLA-DMB, HLA-DPA1, FCRLA, HVCN1, LTB 
       BLNK, P2RX5, IGLL5, IRF8, SWAP70, ARHGAP24, FCGR2B, SMIM14, PPP1R14A, C16orf74 
Negative:  NKG7, PRF1, CST7, GZMB, GZMA, FGFBP2, CTSW, GNLY, B2M, SPON2 
       CCL4, GZMH, FCGR3A, CCL5, CD247, XCL2, CLIC3, AKR1C3, SRGN, HOPX 
       TTC38, APMAP, CTSC, S100A4, IGFBP7, ANXA1, ID2, IL32, XCL1, RHOC 
PC_ 3 
Positive:  HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1, HLA-DPA1, CD74, MS4A1, HLA-DRB1, HLA-DRA 
       HLA-DRB5, HLA-DQA2, TCL1A, LINC00926, HLA-DMB, HLA-DMA, CD37, HVCN1, FCRLA, IRF8 
       PLAC8, BLNK, MALAT1, SMIM14, PLD4, LAT2, IGLL5, P2RX5, SWAP70, FCGR2B 
Negative:  PPBP, PF4, SDPR, SPARC, GNG11, NRGN, GP9, RGS18, TUBB1, CLU 
       HIST1H2AC, AP001189.4, ITGA2B, CD9, TMEM40, PTCRA, CA2, ACRBP, MMD, TREML1 
       NGFRAP1, F13A1, SEPT5, RUFY1, TSC22D1, MPP1, CMTM5, RP11-367G6.3, MYL9, GP1BA 
PC_ 4 
Positive:  HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1, CD74, HLA-DPB1, HIST1H2AC, PF4, TCL1A 
       SDPR, HLA-DPA1, HLA-DRB1, HLA-DQA2, HLA-DRA, PPBP, LINC00926, GNG11, HLA-DRB5, SPARC 
       GP9, AP001189.4, CA2, PTCRA, CD9, NRGN, RGS18, GZMB, CLU, TUBB1 
Negative:  VIM, IL7R, S100A6, IL32, S100A8, S100A4, GIMAP7, S100A10, S100A9, MAL 
       AQP3, CD2, CD14, FYB, LGALS2, GIMAP4, ANXA1, CD27, FCN1, RBP7 
       LYZ, S100A11, GIMAP5, MS4A6A, S100A12, FOLR3, TRABD2A, AIF1, IL8, IFI6 
PC_ 5 
Positive:  GZMB, NKG7, S100A8, FGFBP2, GNLY, CCL4, CST7, PRF1, GZMA, SPON2 
       GZMH, S100A9, LGALS2, CCL3, CTSW, XCL2, CD14, CLIC3, S100A12, CCL5 
       RBP7, MS4A6A, GSTP1, FOLR3, IGFBP7, TYROBP, TTC38, AKR1C3, XCL1, HOPX 
Negative:  LTB, IL7R, CKB, VIM, MS4A7, AQP3, CYTIP, RP11-290F20.3, SIGLEC10, HMOX1 
       PTGES3, LILRB2, MAL, CD27, HN1, CD2, GDI2, ANXA5, CORO1B, TUBA1B 
       FAM110A, ATP1A1, TRADD, PPA1, CCDC109B, ABRACL, CTD-2006K23.1, WARS, VMO1, FYB 

#Seurat provides several useful ways of visualizing both cells and features that define the PCA, including VizDimReduction(), DimPlot(), and DimHeatmap()

# Examine and visualize PCA results a few different ways
print(pbmc[["pca"]], dims = 1:5, nfeatures = 5)
PC_ 1 
Positive:  CST3, TYROBP, LST1, AIF1, FTL 
Negative:  MALAT1, LTB, IL32, IL7R, CD2 
PC_ 2 
Positive:  CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1 
Negative:  NKG7, PRF1, CST7, GZMB, GZMA 
PC_ 3 
Positive:  HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1 
Negative:  PPBP, PF4, SDPR, SPARC, GNG11 
PC_ 4 
Positive:  HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1 
Negative:  VIM, IL7R, S100A6, IL32, S100A8 
PC_ 5 
Positive:  GZMB, NKG7, S100A8, FGFBP2, GNLY 
Negative:  LTB, IL7R, CKB, VIM, MS4A7 

#will generate a visualization that helps interpret the contribution of different genes to the variation captured by the first two principal components in the scRNA-seq dataset stored in pbmc. This visualization can be helpful for understanding the underlying structure and sources of variation in the dataset.

VizDimLoadings(pbmc, dims = 1:2, reduction = "pca")

DimPlot(pbmc, reduction = "pca") + NoLegend()

DimHeatmap(pbmc, dims = 1, cells = 500, balanced = TRUE)

DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)

#Determine the ‘dimensionality’ of the dataset #To overcome the extensive technical noise in any single feature for scRNA-seq data, Seurat clusters cells based on their PCA scores, with each PC essentially representing a ‘metafeature’ that combines information across a correlated feature set. #An alternative heuristic method generates an ‘Elbow plot’: a ranking of principle components based on the percentage of variance explained by each one (ElbowPlot() function). In this example, we can observe an ‘elbow’ around PC9-10, suggesting that the majority of true signal is captured in the first 10 PCs.

ElbowPlot(pbmc)

#Cluster the cells #FindClusters() function implements this procedure, and contains a resolution parameter that sets the ‘granularity’ of the downstream clustering, with increased values leading to a greater number of clusters. We find that setting this parameter between 0.4-1.2 typically returns good results for single-cell datasets of around 3K cells. Optimal resolution often increases for larger datasets. The clusters can be found using the Idents() function.

pbmc <- FindNeighbors(pbmc, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
pbmc <- FindClusters(pbmc, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95965

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8723
Number of communities: 9
Elapsed time: 0 seconds
# Look at cluster IDs of the first 5 cells
head(Idents(pbmc), 5)
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 AAACCGTGTATGCG-1 
               2                3                2                1                6 
Levels: 0 1 2 3 4 5 6 7 8

Run non-linear dimensional reduction (UMAP/tSNE) Seurat offers several non-linear dimensional reduction techniques, such as tSNE and UMAP, to visualize and explore these datasets. We encourage users to leverage techniques like UMAP for visualization, but to avoid drawing biological conclusions solely on the basis of visualization techniques.

pbmc <- RunUMAP(pbmc, dims = 1:10)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session18:04:51 UMAP embedding parameters a = 0.9922 b = 1.112
18:04:51 Read 2638 rows and found 10 numeric columns
18:04:51 Using Annoy for neighbor search, n_neighbors = 30
18:04:51 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
18:04:51 Writing NN index file to temp file /var/folders/x6/ycv8mzcn0_j6bcs5vckhptk80000gn/T//RtmpfniD7X/file3801e52ded2
18:04:51 Searching Annoy index using 1 thread, search_k = 3000
18:04:52 Annoy recall = 100%
18:04:52 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
18:04:53 Initializing from normalized Laplacian + noise (using RSpectra)
18:04:53 Commencing optimization for 500 epochs, with 105124 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
18:04:57 Optimization finished
# note that you can set `label = TRUE` or use the LabelClusters function to help label
# individual clusters
DimPlot(pbmc, reduction = "umap")

#Finding differentially expressed features (cluster biomarkers) #FindAllMarkers() automates this process for all clusters, but you can also test groups of clusters vs. each other, or against all cells.

# find all markers of cluster 2
cluster2.markers <- FindMarkers(pbmc, ident.1 = 2)
head(cluster2.markers, n = 5)
# find all markers of cluster 2
cluster2.markers <- FindMarkers(pbmc, ident.1 = 2)
For a (much!) faster implementation of the Wilcoxon Rank Sum Test,
(default method for FindMarkers) please install the presto package
--------------------------------------------
install.packages('devtools')
devtools::install_github('immunogenomics/presto')
--------------------------------------------
After installation of presto, Seurat will automatically use the more 
efficient implementation (no further action necessary).
This message will be shown once per session

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 03s      
  |+                                                 | 2 % ~01m 02s      
  |++                                                | 3 % ~01m 03s      
  |++                                                | 4 % ~01m 04s      
  |+++                                               | 5 % ~01m 02s      
  |+++                                               | 6 % ~01m 02s      
  |++++                                              | 7 % ~01m 01s      
  |++++                                              | 8 % ~01m 00s      
  |+++++                                             | 9 % ~01m 00s      
  |+++++                                             | 10% ~01m 00s      
  |++++++                                            | 11% ~60s          
  |++++++                                            | 12% ~58s          
  |+++++++                                           | 13% ~58s          
  |+++++++                                           | 14% ~57s          
  |++++++++                                          | 15% ~57s          
  |++++++++                                          | 16% ~56s          
  |+++++++++                                         | 17% ~55s          
  |+++++++++                                         | 18% ~54s          
  |++++++++++                                        | 19% ~53s          
  |++++++++++                                        | 20% ~52s          
  |+++++++++++                                       | 21% ~51s          
  |+++++++++++                                       | 22% ~51s          
  |++++++++++++                                      | 23% ~50s          
  |++++++++++++                                      | 24% ~49s          
  |+++++++++++++                                     | 25% ~49s          
  |+++++++++++++                                     | 26% ~48s          
  |++++++++++++++                                    | 27% ~47s          
  |++++++++++++++                                    | 28% ~47s          
  |+++++++++++++++                                   | 29% ~46s          
  |+++++++++++++++                                   | 30% ~45s          
  |++++++++++++++++                                  | 31% ~45s          
  |++++++++++++++++                                  | 32% ~44s          
  |+++++++++++++++++                                 | 33% ~43s          
  |+++++++++++++++++                                 | 34% ~43s          
  |++++++++++++++++++                                | 35% ~42s          
  |++++++++++++++++++                                | 36% ~41s          
  |+++++++++++++++++++                               | 37% ~41s          
  |+++++++++++++++++++                               | 38% ~40s          
  |++++++++++++++++++++                              | 39% ~39s          
  |++++++++++++++++++++                              | 40% ~39s          
  |+++++++++++++++++++++                             | 41% ~38s          
  |+++++++++++++++++++++                             | 42% ~37s          
  |++++++++++++++++++++++                            | 43% ~37s          
  |++++++++++++++++++++++                            | 44% ~36s          
  |+++++++++++++++++++++++                           | 45% ~35s          
  |+++++++++++++++++++++++                           | 46% ~35s          
  |++++++++++++++++++++++++                          | 47% ~34s          
  |++++++++++++++++++++++++                          | 48% ~33s          
  |+++++++++++++++++++++++++                         | 49% ~33s          
  |+++++++++++++++++++++++++                         | 50% ~32s          
  |++++++++++++++++++++++++++                        | 51% ~31s          
  |++++++++++++++++++++++++++                        | 52% ~31s          
  |+++++++++++++++++++++++++++                       | 53% ~30s          
  |+++++++++++++++++++++++++++                       | 54% ~29s          
  |++++++++++++++++++++++++++++                      | 55% ~29s          
  |++++++++++++++++++++++++++++                      | 56% ~28s          
  |+++++++++++++++++++++++++++++                     | 57% ~28s          
  |+++++++++++++++++++++++++++++                     | 58% ~27s          
  |++++++++++++++++++++++++++++++                    | 59% ~26s          
  |++++++++++++++++++++++++++++++                    | 60% ~26s          
  |+++++++++++++++++++++++++++++++                   | 61% ~25s          
  |+++++++++++++++++++++++++++++++                   | 62% ~24s          
  |++++++++++++++++++++++++++++++++                  | 63% ~24s          
  |++++++++++++++++++++++++++++++++                  | 64% ~23s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~22s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~22s          
  |++++++++++++++++++++++++++++++++++                | 67% ~21s          
  |++++++++++++++++++++++++++++++++++                | 68% ~20s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~20s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~19s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~18s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~18s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~17s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~16s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~16s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~15s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~15s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~14s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~13s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 03s
head(cluster2.markers, n = 5)
# find all markers distinguishing cluster 5 from clusters 0 and 3
cluster5.markers <- FindMarkers(pbmc, ident.1 = 5, ident.2 = c(0, 3))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~39s          
  |+                                                 | 2 % ~41s          
  |++                                                | 3 % ~40s          
  |++                                                | 4 % ~39s          
  |+++                                               | 5 % ~40s          
  |+++                                               | 6 % ~41s          
  |++++                                              | 7 % ~41s          
  |++++                                              | 8 % ~40s          
  |+++++                                             | 9 % ~39s          
  |+++++                                             | 10% ~38s          
  |++++++                                            | 11% ~37s          
  |++++++                                            | 12% ~36s          
  |+++++++                                           | 13% ~36s          
  |+++++++                                           | 14% ~36s          
  |++++++++                                          | 15% ~35s          
  |++++++++                                          | 16% ~35s          
  |+++++++++                                         | 17% ~35s          
  |+++++++++                                         | 18% ~34s          
  |++++++++++                                        | 19% ~34s          
  |++++++++++                                        | 20% ~33s          
  |+++++++++++                                       | 21% ~33s          
  |+++++++++++                                       | 22% ~32s          
  |++++++++++++                                      | 23% ~31s          
  |++++++++++++                                      | 24% ~31s          
  |+++++++++++++                                     | 25% ~31s          
  |+++++++++++++                                     | 26% ~30s          
  |++++++++++++++                                    | 27% ~30s          
  |++++++++++++++                                    | 28% ~29s          
  |+++++++++++++++                                   | 29% ~29s          
  |+++++++++++++++                                   | 30% ~29s          
  |++++++++++++++++                                  | 31% ~28s          
  |++++++++++++++++                                  | 32% ~28s          
  |+++++++++++++++++                                 | 33% ~27s          
  |+++++++++++++++++                                 | 34% ~27s          
  |++++++++++++++++++                                | 35% ~27s          
  |++++++++++++++++++                                | 36% ~26s          
  |+++++++++++++++++++                               | 37% ~26s          
  |+++++++++++++++++++                               | 38% ~25s          
  |++++++++++++++++++++                              | 39% ~25s          
  |++++++++++++++++++++                              | 40% ~24s          
  |+++++++++++++++++++++                             | 41% ~24s          
  |+++++++++++++++++++++                             | 42% ~23s          
  |++++++++++++++++++++++                            | 43% ~23s          
  |++++++++++++++++++++++                            | 44% ~22s          
  |+++++++++++++++++++++++                           | 45% ~22s          
  |+++++++++++++++++++++++                           | 46% ~22s          
  |++++++++++++++++++++++++                          | 47% ~21s          
  |++++++++++++++++++++++++                          | 48% ~21s          
  |+++++++++++++++++++++++++                         | 49% ~20s          
  |+++++++++++++++++++++++++                         | 50% ~20s          
  |++++++++++++++++++++++++++                        | 51% ~20s          
  |++++++++++++++++++++++++++                        | 52% ~19s          
  |+++++++++++++++++++++++++++                       | 53% ~19s          
  |+++++++++++++++++++++++++++                       | 54% ~18s          
  |++++++++++++++++++++++++++++                      | 55% ~18s          
  |++++++++++++++++++++++++++++                      | 56% ~18s          
  |+++++++++++++++++++++++++++++                     | 57% ~17s          
  |+++++++++++++++++++++++++++++                     | 58% ~17s          
  |++++++++++++++++++++++++++++++                    | 59% ~17s          
  |++++++++++++++++++++++++++++++                    | 60% ~16s          
  |+++++++++++++++++++++++++++++++                   | 61% ~16s          
  |+++++++++++++++++++++++++++++++                   | 62% ~15s          
  |++++++++++++++++++++++++++++++++                  | 63% ~15s          
  |++++++++++++++++++++++++++++++++                  | 64% ~14s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~14s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~14s          
  |++++++++++++++++++++++++++++++++++                | 67% ~13s          
  |++++++++++++++++++++++++++++++++++                | 68% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~11s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~11s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~10s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~09s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~08s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=41s  
head(cluster5.markers, n = 5)
# find markers for every cluster compared to all remaining cells, report only the positive
# ones
pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~22s          
  |+                                                 | 2 % ~19s          
  |++                                                | 3 % ~20s          
  |++                                                | 4 % ~19s          
  |+++                                               | 5 % ~18s          
  |+++                                               | 6 % ~18s          
  |++++                                              | 7 % ~17s          
  |++++                                              | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |+++++                                             | 10% ~16s          
  |++++++                                            | 11% ~16s          
  |++++++                                            | 12% ~16s          
  |+++++++                                           | 13% ~15s          
  |+++++++                                           | 14% ~15s          
  |++++++++                                          | 15% ~15s          
  |++++++++                                          | 16% ~15s          
  |+++++++++                                         | 17% ~14s          
  |+++++++++                                         | 18% ~14s          
  |++++++++++                                        | 19% ~14s          
  |++++++++++                                        | 20% ~14s          
  |+++++++++++                                       | 21% ~14s          
  |+++++++++++                                       | 22% ~13s          
  |++++++++++++                                      | 23% ~13s          
  |++++++++++++                                      | 24% ~13s          
  |+++++++++++++                                     | 25% ~13s          
  |+++++++++++++                                     | 26% ~13s          
  |++++++++++++++                                    | 27% ~12s          
  |++++++++++++++                                    | 28% ~12s          
  |+++++++++++++++                                   | 29% ~12s          
  |+++++++++++++++                                   | 30% ~12s          
  |++++++++++++++++                                  | 31% ~12s          
  |++++++++++++++++                                  | 32% ~11s          
  |+++++++++++++++++                                 | 33% ~11s          
  |+++++++++++++++++                                 | 34% ~11s          
  |++++++++++++++++++                                | 35% ~11s          
  |++++++++++++++++++                                | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~11s          
  |+++++++++++++++++++                               | 38% ~10s          
  |++++++++++++++++++++                              | 39% ~10s          
  |++++++++++++++++++++                              | 40% ~10s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |+++++++++++++++++++++                             | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |++++++++++++++++++++++                            | 44% ~09s          
  |+++++++++++++++++++++++                           | 45% ~09s          
  |+++++++++++++++++++++++                           | 46% ~09s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~08s          
  |+++++++++++++++++++++++++                         | 50% ~08s          
  |++++++++++++++++++++++++++                        | 51% ~08s          
  |++++++++++++++++++++++++++                        | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~07s          
  |+++++++++++++++++++++++++++++                     | 57% ~07s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~18s          
  |++                                                | 2 % ~17s          
  |++                                                | 3 % ~17s          
  |+++                                               | 4 % ~17s          
  |+++                                               | 5 % ~17s          
  |++++                                              | 6 % ~16s          
  |++++                                              | 7 % ~16s          
  |+++++                                             | 8 % ~16s          
  |+++++                                             | 9 % ~16s          
  |++++++                                            | 10% ~16s          
  |++++++                                            | 11% ~16s          
  |+++++++                                           | 12% ~15s          
  |+++++++                                           | 13% ~15s          
  |++++++++                                          | 14% ~16s          
  |++++++++                                          | 15% ~15s          
  |+++++++++                                         | 16% ~15s          
  |+++++++++                                         | 17% ~15s          
  |++++++++++                                        | 18% ~15s          
  |++++++++++                                        | 19% ~14s          
  |+++++++++++                                       | 20% ~14s          
  |+++++++++++                                       | 21% ~14s          
  |++++++++++++                                      | 22% ~14s          
  |++++++++++++                                      | 23% ~14s          
  |+++++++++++++                                     | 24% ~13s          
  |+++++++++++++                                     | 25% ~13s          
  |++++++++++++++                                    | 26% ~13s          
  |++++++++++++++                                    | 27% ~13s          
  |+++++++++++++++                                   | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |++++++++++++++++                                  | 30% ~12s          
  |++++++++++++++++                                  | 31% ~12s          
  |+++++++++++++++++                                 | 32% ~12s          
  |+++++++++++++++++                                 | 33% ~12s          
  |++++++++++++++++++                                | 34% ~12s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~11s          
  |++++++++++++++++++++                              | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~11s          
  |+++++++++++++++++++++                             | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |++++++++++++++++++++++                            | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |+++++++++++++++++++++++                           | 44% ~10s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |++++++++++++++++++++++++                          | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |+++++++++++++++++++++++++                         | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |++++++++++++++++++++++++++                        | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |+++++++++++++++++++++++++++++++                   | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~23s          
  |++                                                | 2 % ~27s          
  |++                                                | 3 % ~25s          
  |+++                                               | 4 % ~24s          
  |+++                                               | 5 % ~24s          
  |++++                                              | 6 % ~23s          
  |++++                                              | 7 % ~23s          
  |+++++                                             | 8 % ~22s          
  |+++++                                             | 9 % ~22s          
  |++++++                                            | 10% ~22s          
  |++++++                                            | 11% ~22s          
  |+++++++                                           | 12% ~21s          
  |+++++++                                           | 13% ~21s          
  |++++++++                                          | 14% ~21s          
  |++++++++                                          | 15% ~21s          
  |+++++++++                                         | 16% ~21s          
  |+++++++++                                         | 17% ~20s          
  |++++++++++                                        | 18% ~20s          
  |++++++++++                                        | 19% ~20s          
  |+++++++++++                                       | 20% ~19s          
  |+++++++++++                                       | 21% ~19s          
  |++++++++++++                                      | 22% ~19s          
  |++++++++++++                                      | 23% ~18s          
  |+++++++++++++                                     | 24% ~18s          
  |+++++++++++++                                     | 25% ~18s          
  |++++++++++++++                                    | 26% ~18s          
  |++++++++++++++                                    | 27% ~17s          
  |+++++++++++++++                                   | 28% ~17s          
  |+++++++++++++++                                   | 29% ~17s          
  |++++++++++++++++                                  | 30% ~17s          
  |++++++++++++++++                                  | 31% ~16s          
  |+++++++++++++++++                                 | 32% ~16s          
  |+++++++++++++++++                                 | 33% ~16s          
  |++++++++++++++++++                                | 34% ~16s          
  |++++++++++++++++++                                | 35% ~15s          
  |+++++++++++++++++++                               | 36% ~15s          
  |+++++++++++++++++++                               | 37% ~15s          
  |++++++++++++++++++++                              | 38% ~15s          
  |++++++++++++++++++++                              | 39% ~15s          
  |+++++++++++++++++++++                             | 40% ~14s          
  |+++++++++++++++++++++                             | 41% ~14s          
  |++++++++++++++++++++++                            | 42% ~14s          
  |++++++++++++++++++++++                            | 43% ~14s          
  |+++++++++++++++++++++++                           | 44% ~13s          
  |+++++++++++++++++++++++                           | 45% ~13s          
  |++++++++++++++++++++++++                          | 46% ~13s          
  |++++++++++++++++++++++++                          | 47% ~13s          
  |+++++++++++++++++++++++++                         | 48% ~12s          
  |+++++++++++++++++++++++++                         | 49% ~12s          
  |++++++++++++++++++++++++++                        | 51% ~12s          
  |++++++++++++++++++++++++++                        | 52% ~12s          
  |+++++++++++++++++++++++++++                       | 53% ~11s          
  |+++++++++++++++++++++++++++                       | 54% ~11s          
  |++++++++++++++++++++++++++++                      | 55% ~11s          
  |++++++++++++++++++++++++++++                      | 56% ~11s          
  |+++++++++++++++++++++++++++++                     | 57% ~10s          
  |+++++++++++++++++++++++++++++                     | 58% ~10s          
  |++++++++++++++++++++++++++++++                    | 59% ~10s          
  |++++++++++++++++++++++++++++++                    | 60% ~10s          
  |+++++++++++++++++++++++++++++++                   | 61% ~09s          
  |+++++++++++++++++++++++++++++++                   | 62% ~09s          
  |++++++++++++++++++++++++++++++++                  | 63% ~09s          
  |++++++++++++++++++++++++++++++++                  | 64% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~08s          
  |++++++++++++++++++++++++++++++++++                | 67% ~08s          
  |++++++++++++++++++++++++++++++++++                | 68% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=23s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~19s          
  |++++                                              | 7 % ~19s          
  |+++++                                             | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~18s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~17s          
  |++++++++                                          | 15% ~17s          
  |+++++++++                                         | 16% ~17s          
  |+++++++++                                         | 17% ~17s          
  |++++++++++                                        | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |+++++++++++                                       | 20% ~16s          
  |+++++++++++                                       | 21% ~16s          
  |++++++++++++                                      | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |+++++++++++++                                     | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |++++++++++++++                                    | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |+++++++++++++++                                   | 28% ~14s          
  |+++++++++++++++                                   | 29% ~14s          
  |++++++++++++++++                                  | 30% ~14s          
  |++++++++++++++++                                  | 31% ~14s          
  |+++++++++++++++++                                 | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~28s          
  |+                                                 | 2 % ~28s          
  |++                                                | 3 % ~28s          
  |++                                                | 4 % ~30s          
  |+++                                               | 5 % ~29s          
  |+++                                               | 6 % ~28s          
  |++++                                              | 7 % ~28s          
  |++++                                              | 8 % ~27s          
  |+++++                                             | 9 % ~26s          
  |+++++                                             | 10% ~26s          
  |++++++                                            | 11% ~26s          
  |++++++                                            | 12% ~26s          
  |+++++++                                           | 13% ~25s          
  |+++++++                                           | 14% ~25s          
  |++++++++                                          | 15% ~25s          
  |++++++++                                          | 16% ~24s          
  |+++++++++                                         | 17% ~24s          
  |+++++++++                                         | 18% ~24s          
  |++++++++++                                        | 19% ~23s          
  |++++++++++                                        | 20% ~23s          
  |+++++++++++                                       | 21% ~22s          
  |+++++++++++                                       | 22% ~22s          
  |++++++++++++                                      | 23% ~22s          
  |++++++++++++                                      | 24% ~22s          
  |+++++++++++++                                     | 25% ~21s          
  |+++++++++++++                                     | 26% ~21s          
  |++++++++++++++                                    | 27% ~21s          
  |++++++++++++++                                    | 28% ~20s          
  |+++++++++++++++                                   | 29% ~20s          
  |+++++++++++++++                                   | 30% ~20s          
  |++++++++++++++++                                  | 31% ~19s          
  |++++++++++++++++                                  | 32% ~19s          
  |+++++++++++++++++                                 | 33% ~19s          
  |+++++++++++++++++                                 | 34% ~19s          
  |++++++++++++++++++                                | 35% ~18s          
  |++++++++++++++++++                                | 36% ~18s          
  |+++++++++++++++++++                               | 37% ~18s          
  |+++++++++++++++++++                               | 38% ~17s          
  |++++++++++++++++++++                              | 39% ~17s          
  |++++++++++++++++++++                              | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |+++++++++++++++++++++                             | 42% ~16s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |++++++++++++++++++++++                            | 44% ~16s          
  |+++++++++++++++++++++++                           | 45% ~15s          
  |+++++++++++++++++++++++                           | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~15s          
  |++++++++++++++++++++++++                          | 48% ~14s          
  |+++++++++++++++++++++++++                         | 49% ~14s          
  |+++++++++++++++++++++++++                         | 50% ~14s          
  |++++++++++++++++++++++++++                        | 51% ~13s          
  |++++++++++++++++++++++++++                        | 52% ~13s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |+++++++++++++++++++++++++++                       | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |++++++++++++++++++++++++++++                      | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |+++++++++++++++++++++++++++++                     | 58% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |++++++++++++++++++++++++++++++                    | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |++++++++++++++++++++++++++++++++++                | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~23s          
  |+                                                 | 2 % ~22s          
  |++                                                | 3 % ~22s          
  |++                                                | 4 % ~21s          
  |+++                                               | 5 % ~21s          
  |+++                                               | 6 % ~22s          
  |++++                                              | 7 % ~22s          
  |++++                                              | 8 % ~21s          
  |+++++                                             | 9 % ~21s          
  |+++++                                             | 10% ~21s          
  |++++++                                            | 11% ~20s          
  |++++++                                            | 12% ~20s          
  |+++++++                                           | 13% ~20s          
  |+++++++                                           | 14% ~20s          
  |++++++++                                          | 15% ~20s          
  |++++++++                                          | 16% ~19s          
  |+++++++++                                         | 17% ~19s          
  |+++++++++                                         | 18% ~19s          
  |++++++++++                                        | 19% ~19s          
  |++++++++++                                        | 20% ~19s          
  |+++++++++++                                       | 21% ~18s          
  |+++++++++++                                       | 22% ~18s          
  |++++++++++++                                      | 23% ~18s          
  |++++++++++++                                      | 24% ~17s          
  |+++++++++++++                                     | 25% ~17s          
  |+++++++++++++                                     | 26% ~17s          
  |++++++++++++++                                    | 27% ~16s          
  |++++++++++++++                                    | 28% ~16s          
  |+++++++++++++++                                   | 29% ~16s          
  |+++++++++++++++                                   | 30% ~16s          
  |++++++++++++++++                                  | 31% ~16s          
  |++++++++++++++++                                  | 32% ~15s          
  |+++++++++++++++++                                 | 33% ~15s          
  |+++++++++++++++++                                 | 34% ~15s          
  |++++++++++++++++++                                | 35% ~14s          
  |++++++++++++++++++                                | 36% ~14s          
  |+++++++++++++++++++                               | 37% ~14s          
  |+++++++++++++++++++                               | 38% ~14s          
  |++++++++++++++++++++                              | 39% ~14s          
  |++++++++++++++++++++                              | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~13s          
  |++++++++++++++++++++++                            | 43% ~13s          
  |++++++++++++++++++++++                            | 44% ~13s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |+++++++++++++++++++++++                           | 46% ~12s          
  |++++++++++++++++++++++++                          | 47% ~12s          
  |++++++++++++++++++++++++                          | 48% ~12s          
  |+++++++++++++++++++++++++                         | 49% ~12s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |++++++++++++++++++++++++++                        | 52% ~11s          
  |+++++++++++++++++++++++++++                       | 53% ~11s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~10s          
  |+++++++++++++++++++++++++++++                     | 57% ~10s          
  |+++++++++++++++++++++++++++++                     | 58% ~10s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~09s          
  |+++++++++++++++++++++++++++++++                   | 62% ~09s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~08s          
  |++++++++++++++++++++++++++++++++++                | 67% ~08s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=23s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~41s          
  |+                                                 | 2 % ~37s          
  |++                                                | 3 % ~36s          
  |++                                                | 4 % ~35s          
  |+++                                               | 5 % ~34s          
  |+++                                               | 6 % ~33s          
  |++++                                              | 7 % ~33s          
  |++++                                              | 8 % ~32s          
  |+++++                                             | 9 % ~32s          
  |+++++                                             | 10% ~32s          
  |++++++                                            | 11% ~31s          
  |++++++                                            | 12% ~31s          
  |+++++++                                           | 13% ~31s          
  |+++++++                                           | 14% ~31s          
  |++++++++                                          | 15% ~30s          
  |++++++++                                          | 16% ~30s          
  |+++++++++                                         | 17% ~29s          
  |+++++++++                                         | 18% ~29s          
  |++++++++++                                        | 19% ~28s          
  |++++++++++                                        | 20% ~28s          
  |+++++++++++                                       | 21% ~28s          
  |+++++++++++                                       | 22% ~27s          
  |++++++++++++                                      | 23% ~27s          
  |++++++++++++                                      | 24% ~26s          
  |+++++++++++++                                     | 25% ~26s          
  |+++++++++++++                                     | 26% ~25s          
  |++++++++++++++                                    | 27% ~25s          
  |++++++++++++++                                    | 28% ~25s          
  |+++++++++++++++                                   | 29% ~24s          
  |+++++++++++++++                                   | 30% ~24s          
  |++++++++++++++++                                  | 31% ~23s          
  |++++++++++++++++                                  | 32% ~23s          
  |+++++++++++++++++                                 | 33% ~23s          
  |+++++++++++++++++                                 | 34% ~22s          
  |++++++++++++++++++                                | 35% ~22s          
  |++++++++++++++++++                                | 36% ~21s          
  |+++++++++++++++++++                               | 37% ~21s          
  |+++++++++++++++++++                               | 38% ~21s          
  |++++++++++++++++++++                              | 39% ~20s          
  |++++++++++++++++++++                              | 40% ~20s          
  |+++++++++++++++++++++                             | 41% ~20s          
  |+++++++++++++++++++++                             | 42% ~19s          
  |++++++++++++++++++++++                            | 43% ~19s          
  |++++++++++++++++++++++                            | 44% ~19s          
  |+++++++++++++++++++++++                           | 45% ~18s          
  |+++++++++++++++++++++++                           | 46% ~18s          
  |++++++++++++++++++++++++                          | 47% ~18s          
  |++++++++++++++++++++++++                          | 48% ~17s          
  |+++++++++++++++++++++++++                         | 49% ~17s          
  |+++++++++++++++++++++++++                         | 50% ~16s          
  |++++++++++++++++++++++++++                        | 51% ~16s          
  |++++++++++++++++++++++++++                        | 52% ~16s          
  |+++++++++++++++++++++++++++                       | 53% ~15s          
  |+++++++++++++++++++++++++++                       | 54% ~15s          
  |++++++++++++++++++++++++++++                      | 55% ~15s          
  |++++++++++++++++++++++++++++                      | 56% ~14s          
  |+++++++++++++++++++++++++++++                     | 57% ~14s          
  |+++++++++++++++++++++++++++++                     | 58% ~14s          
  |++++++++++++++++++++++++++++++                    | 59% ~13s          
  |++++++++++++++++++++++++++++++                    | 60% ~13s          
  |+++++++++++++++++++++++++++++++                   | 61% ~13s          
  |+++++++++++++++++++++++++++++++                   | 62% ~12s          
  |++++++++++++++++++++++++++++++++                  | 63% ~12s          
  |++++++++++++++++++++++++++++++++                  | 64% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~11s          
  |++++++++++++++++++++++++++++++++++                | 67% ~11s          
  |++++++++++++++++++++++++++++++++++                | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~10s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~08s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=32s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~27s          
  |+                                                 | 2 % ~28s          
  |++                                                | 3 % ~28s          
  |++                                                | 4 % ~27s          
  |+++                                               | 5 % ~27s          
  |+++                                               | 6 % ~26s          
  |++++                                              | 7 % ~26s          
  |++++                                              | 8 % ~27s          
  |+++++                                             | 9 % ~26s          
  |+++++                                             | 10% ~26s          
  |++++++                                            | 11% ~25s          
  |++++++                                            | 12% ~25s          
  |+++++++                                           | 13% ~25s          
  |+++++++                                           | 14% ~24s          
  |++++++++                                          | 15% ~24s          
  |++++++++                                          | 16% ~24s          
  |+++++++++                                         | 17% ~24s          
  |+++++++++                                         | 18% ~24s          
  |++++++++++                                        | 19% ~23s          
  |++++++++++                                        | 20% ~23s          
  |+++++++++++                                       | 21% ~23s          
  |+++++++++++                                       | 22% ~22s          
  |++++++++++++                                      | 23% ~22s          
  |++++++++++++                                      | 24% ~22s          
  |+++++++++++++                                     | 25% ~22s          
  |+++++++++++++                                     | 26% ~21s          
  |++++++++++++++                                    | 27% ~21s          
  |++++++++++++++                                    | 28% ~21s          
  |+++++++++++++++                                   | 29% ~20s          
  |+++++++++++++++                                   | 30% ~20s          
  |++++++++++++++++                                  | 31% ~20s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~19s          
  |+++++++++++++++++                                 | 34% ~19s          
  |++++++++++++++++++                                | 35% ~19s          
  |++++++++++++++++++                                | 36% ~18s          
  |+++++++++++++++++++                               | 37% ~18s          
  |+++++++++++++++++++                               | 38% ~18s          
  |++++++++++++++++++++                              | 39% ~17s          
  |++++++++++++++++++++                              | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |+++++++++++++++++++++                             | 42% ~17s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |++++++++++++++++++++++                            | 44% ~16s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |+++++++++++++++++++++++                           | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~15s          
  |++++++++++++++++++++++++                          | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~14s          
  |+++++++++++++++++++++++++                         | 50% ~14s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |++++++++++++++++++++++++++                        | 52% ~14s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |+++++++++++++++++++++++++++                       | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |++++++++++++++++++++++++++++                      | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |+++++++++++++++++++++++++++++                     | 58% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |++++++++++++++++++++++++++++++                    | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~11s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |++++++++++++++++++++++++++++++++++                | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~13s          
  |+                                                 | 2 % ~13s          
  |++                                                | 3 % ~13s          
  |++                                                | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |+++                                               | 6 % ~14s          
  |++++                                              | 7 % ~14s          
  |++++                                              | 8 % ~14s          
  |+++++                                             | 9 % ~14s          
  |+++++                                             | 10% ~14s          
  |++++++                                            | 11% ~14s          
  |++++++                                            | 12% ~14s          
  |+++++++                                           | 13% ~13s          
  |+++++++                                           | 14% ~13s          
  |++++++++                                          | 15% ~13s          
  |++++++++                                          | 16% ~13s          
  |+++++++++                                         | 17% ~13s          
  |+++++++++                                         | 18% ~13s          
  |++++++++++                                        | 19% ~13s          
  |++++++++++                                        | 20% ~12s          
  |+++++++++++                                       | 21% ~12s          
  |+++++++++++                                       | 22% ~12s          
  |++++++++++++                                      | 23% ~12s          
  |++++++++++++                                      | 24% ~12s          
  |+++++++++++++                                     | 25% ~11s          
  |+++++++++++++                                     | 26% ~11s          
  |++++++++++++++                                    | 27% ~11s          
  |++++++++++++++                                    | 28% ~11s          
  |+++++++++++++++                                   | 29% ~11s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~10s          
  |+++++++++++++++++                                 | 33% ~10s          
  |+++++++++++++++++                                 | 34% ~10s          
  |++++++++++++++++++                                | 35% ~10s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~09s          
  |+++++++++++++++++++++                             | 41% ~09s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |+++++++++++++++++++++++++++                       | 54% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |+++++++++++++++++++++++++++++                     | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
pbmc.markers %>%
    group_by(cluster) %>%
    dplyr::filter(avg_log2FC > 1)

VlnPlot() (shows expression probability distributions across clusters), and FeaturePlot() (visualizes feature expression on a tSNE or PCA plot) are our most commonly used visualizations. We also suggest exploring RidgePlot(), CellScatter(), and DotPlot() as additional methods to view your dataset.

#whats the difference between the two? #VlnPlot is used for examining the distribution of gene expression values across cells, while FeaturePlot is used to visualize the expression patterns of specific genes within the context of cell clusters or dimensionality reduction plots.

cluster0.markers <- FindMarkers(pbmc, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~04s          
  |++                                                | 2 % ~04s          
  |++                                                | 3 % ~04s          
  |+++                                               | 4 % ~04s          
  |+++                                               | 5 % ~04s          
  |++++                                              | 6 % ~04s          
  |++++                                              | 7 % ~04s          
  |+++++                                             | 8 % ~04s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~04s          
  |++++++                                            | 11% ~04s          
  |+++++++                                           | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |++++++++                                          | 14% ~04s          
  |++++++++                                          | 15% ~04s          
  |+++++++++                                         | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |++++++++++                                        | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~03s          
  |+++++++++++++                                     | 26% ~03s          
  |++++++++++++++                                    | 27% ~03s          
  |++++++++++++++                                    | 28% ~03s          
  |+++++++++++++++                                   | 29% ~03s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          

#violin plots will show the distribution of expression levels for the specified features, providing insights into their expression patterns across cells in the dataset.

# you can plot raw counts as well
VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts", log = TRUE)

#creates a feature plot - shows distribution of gene expression

FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP",
    "CD8A"))

#DoHeatmap() generates an expression heatmap for given cells and features. In this case, we are plotting the top 20 markers (or all markers if less than 20) for each cluster.

pbmc.markers %>%
    group_by(cluster) %>%
    dplyr::filter(avg_log2FC > 1) %>%
    slice_head(n = 10) %>%
    ungroup() -> top10
DoHeatmap(pbmc, features = top10$gene) + NoLegend()

#Assigning cell type identity to clusters Fortunately in the case of this dataset, we can use canonical markers to easily match the unbiased clustering to known cell types: Cluster ID Markers Cell Type 0 IL7R, CCR7 Naive CD4+ T 1 CD14, LYZ CD14+ Mono 2 IL7R, S100A4 Memory CD4+ 3 MS4A1 B 4 CD8A CD8+ T 5 FCGR3A, MS4A7 FCGR3A+ Mono 6 GNLY, NKG7 NK 7 FCER1A, CST3 DC 8 PPBP Platelet

new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono",
    "NK", "DC", "Platelet")
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)
DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

Creates a UMAP plot of the pbmc dataset using the DimPlot function. It specifies UMAP as the reduction method and adds axis labels for UMAP 1 and UMAP 2. Additionally, it customizes the appearance of the plot by setting the size of axis titles and legend text.

library(ggplot2)
plot <- DimPlot(pbmc, reduction = "umap", label = TRUE, label.size = 4.5) + xlab("UMAP 1") + ylab("UMAP 2") +
    theme(axis.title = element_text(size = 18), legend.text = element_text(size = 18)) + guides(colour = guide_legend(override.aes = list(size = 10)))
ggsave(filename = "../output/images/pbmc3k_umap.jpg", height = 7, width = 12, plot = plot, quality = 50)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKI0ZvciB0aGlzIHR1dG9yaWFsLCB3ZSB3aWxsIGJlIGFuYWx5emluZyB0aGUgYSBkYXRhc2V0IG9mIFBlcmlwaGVyYWwgQmxvb2QgTW9ub251Y2xlYXIgQ2VsbHMgKFBCTUMpIGZyZWVseSBhdmFpbGFibGUgZnJvbSAxMFggR2Vub21pY3MuIFRoZXJlIGFyZSAyLDcwMCBzaW5nbGUgY2VsbHMgdGhhdCB3ZXJlIHNlcXVlbmNlZCBvbiB0aGUgSWxsdW1pbmEgTmV4dFNlcSA1MDAuCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIAoKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIAoKYGBge3J9CmxpYnJhcnkoZHBseXIpICNpcyBhIHBvd2VyZnVsIFIgcGFja2FnZSBmb3IgZGF0YSBtYW5pcHVsYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLgpsaWJyYXJ5KFNldXJhdCkjaW1wbGVtZW50cyB2YXJpb3VzIGFsZ29yaXRobXMgYW5kIHRlY2huaXF1ZXMgY29tbW9ubHkgdXNlZCBpbiBzaW5nbGUtY2VsbCBhbmFseXNpcywgc3VjaCBhcyBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpLCB0LWRpc3RyaWJ1dGVkIHN0b2NoYXN0aWMgbmVpZ2hib3IgZW1iZWRkaW5nICh0LVNORSksIGFuZCB1bmlmb3JtIG1hbmlmb2xkIGFwcHJveGltYXRpb24gYW5kIHByb2plY3Rpb24gKFVNQVApLgpsaWJyYXJ5KHBhdGNod29yaykjIGlzIGFuIFIgcGFja2FnZSBmb3IgY29tYmluaW5nIG11bHRpcGxlIHBsb3RzIGludG8gYSBzaW5nbGUgZmlndXJlIG9yIGxheW91dC4KCiMgTG9hZCB0aGUgUEJNQyBkYXRhc2V0CnBibWMuZGF0YSA8LSBSZWFkMTBYKGRhdGEuZGlyID0gIi9Vc2Vycy9zdXJhbmdpamF5YXNpbmdoZS9maWx0ZXJlZF9nZW5lX2JjX21hdHJpY2VzIDIvaGcxOS8iKQojIEluaXRpYWxpemUgdGhlIFNldXJhdCBvYmplY3Qgd2l0aCB0aGUgcmF3IChub24tbm9ybWFsaXplZCBkYXRhKS4KcGJtYyA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gcGJtYy5kYXRhLCBwcm9qZWN0ID0gInBibWMzayIsIG1pbi5jZWxscyA9IDMsIG1pbi5mZWF0dXJlcyA9IDIwMCkKcGJtYwoKYGBgCgpUaGUgbnVtYmVyIG9mIHVuaXF1ZSBnZW5lcyBkZXRlY3RlZCBpbiBlYWNoIGNlbGwuCkxvdy1xdWFsaXR5IGNlbGxzIG9yIGVtcHR5IGRyb3BsZXRzIHdpbGwgb2Z0ZW4gaGF2ZSB2ZXJ5IGZldyBnZW5lcwpDZWxsIGRvdWJsZXRzIG9yIG11bHRpcGxldHMgbWF5IGV4aGliaXQgYW4gYWJlcnJhbnRseSBoaWdoIGdlbmUgY291bnQKU2ltaWxhcmx5LCB0aGUgdG90YWwgbnVtYmVyIG9mIG1vbGVjdWxlcyBkZXRlY3RlZCB3aXRoaW4gYSBjZWxsIChjb3JyZWxhdGVzIHN0cm9uZ2x5IHdpdGggdW5pcXVlIGdlbmVzKQpUaGUgcGVyY2VudGFnZSBvZiByZWFkcyB0aGF0IG1hcCB0byB0aGUgbWl0b2Nob25kcmlhbCBnZW5vbWUKTG93LXF1YWxpdHkgLyBkeWluZyBjZWxscyBvZnRlbiBleGhpYml0IGV4dGVuc2l2ZSBtaXRvY2hvbmRyaWFsIGNvbnRhbWluYXRpb24KV2UgY2FsY3VsYXRlIG1pdG9jaG9uZHJpYWwgUUMgbWV0cmljcyB3aXRoIHRoZSBQZXJjZW50YWdlRmVhdHVyZVNldCgpIGZ1bmN0aW9uLCB3aGljaCBjYWxjdWxhdGVzIHRoZSBwZXJjZW50YWdlIG9mIGNvdW50cyBvcmlnaW5hdGluZyBmcm9tIGEgc2V0IG9mIGZlYXR1cmVzCldlIHVzZSB0aGUgc2V0IG9mIGFsbCBnZW5lcyBzdGFydGluZyB3aXRoIE1ULSBhcyBhIHNldCBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzCgpgYGB7cn0KIyBUaGUgW1sgb3BlcmF0b3IgY2FuIGFkZCBjb2x1bW5zIHRvIG9iamVjdCBtZXRhZGF0YS4gVGhpcyBpcyBhIGdyZWF0IHBsYWNlIHRvIHN0YXNoIFFDIHN0YXRzCnBibWNbWyJwZXJjZW50Lm10Il1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KHBibWMsIHBhdHRlcm4gPSAiXk1ULSIpCmBgYApJbiB0aGUgZXhhbXBsZSBiZWxvdywgd2UgdmlzdWFsaXplIFFDIG1ldHJpY3MsIGFuZCB1c2UgdGhlc2UgdG8gZmlsdGVyIGNlbGxzLgoKV2UgZmlsdGVyIGNlbGxzIHRoYXQgaGF2ZSB1bmlxdWUgZmVhdHVyZSBjb3VudHMgb3ZlciAyLDUwMCBvciBsZXNzIHRoYW4gMjAwCldlIGZpbHRlciBjZWxscyB0aGF0IGhhdmUgPjUlIG1pdG9jaG9uZHJpYWwgY291bnRzCmBgYHtyfQojIFZpc3VhbGl6ZSBRQyBtZXRyaWNzIGFzIGEgdmlvbGluIHBsb3QKVmxuUGxvdChwYm1jLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiKSwgbmNvbCA9IDMpCmBgYAoKYGBge3J9CiMgRmVhdHVyZVNjYXR0ZXIgaXMgdHlwaWNhbGx5IHVzZWQgdG8gdmlzdWFsaXplIGZlYXR1cmUtZmVhdHVyZSByZWxhdGlvbnNoaXBzLCBidXQgY2FuIGJlIHVzZWQKIyBmb3IgYW55dGhpbmcgY2FsY3VsYXRlZCBieSB0aGUgb2JqZWN0LCBpLmUuIGNvbHVtbnMgaW4gb2JqZWN0IG1ldGFkYXRhLCBQQyBzY29yZXMgZXRjLgoKcGxvdDEgPC0gRmVhdHVyZVNjYXR0ZXIocGJtYywgZmVhdHVyZTEgPSAibkNvdW50X1JOQSIsIGZlYXR1cmUyID0gInBlcmNlbnQubXQiKQpwbG90MiA8LSBGZWF0dXJlU2NhdHRlcihwYm1jLCBmZWF0dXJlMSA9ICJuQ291bnRfUk5BIiwgZmVhdHVyZTIgPSAibkZlYXR1cmVfUk5BIikKcGxvdDEgKyBwbG90MgpgYGAKCgpgYGB7cn0KcGJtYyA8LSBzdWJzZXQocGJtYywgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gMjAwICYgbkZlYXR1cmVfUk5BIDwgMjUwMCAmIHBlcmNlbnQubXQgPCA1KQojc3Vic2V0KHBibWMsIHN1YnNldCA9IC4uLik6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdWJzZXQvZmlsdGVyIHRoZSBkYXRhc2V0IHBibWMgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zIHNwZWNpZmllZCBpbiB0aGUgc3Vic2V0IGFyZ3VtZW50LgojbkZlYXR1cmVfUk5BOiBUaGlzIGlzIGEgbWV0cmljIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRldGVjdGVkIFJOQSBmZWF0dXJlcyAoZ2VuZXMpIGluIGVhY2ggY2VsbC4gSXQncyBhIG1lYXN1cmUgb2YgdGhlIGNvbXBsZXhpdHkgb2YgZ2VuZSBleHByZXNzaW9uIHdpdGhpbiBhIGNlbGwuCmBgYAojTmV4dCBOb3JtYWxpemUgdGhlIGRhdGEhIEFmdGVyIEFmdGVyIHJlbW92aW5nIHVud2FudGVkIGNlbGxzIGZyb20gdGhlIGRhdGFzZXQsIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbm9ybWFsaXplIHRoZSBkYXRhLiAKI0dsb2JhbC1zY2FsaW5nIG5vcm1hbGl6YXRpb24gbWV0aG9kIOKAnExvZ05vcm1hbGl6ZeKAnSB0aGF0IG5vcm1hbGl6ZXMgdGhlIGZlYXR1cmUgZXhwcmVzc2lvbiBtZWFzdXJlbWVudHMgZm9yIGVhY2ggY2VsbCBieSB0aGUgdG90YWwgZXhwcmVzc2lvbiwgbXVsdGlwbGllcyB0aGlzIGJ5IGEgc2NhbGUgZmFjdG9yICgxMCwwMDAgYnkgZGVmYXVsdCksIGFuZCBsb2ctdHJhbnNmb3JtcyB0aGUgcmVzdWx0LiBJbiBTZXVyYXQgdjUsIE5vcm1hbGl6ZWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gcGJtY1tbIlJOQSJdXSRkYXRhLgpgYGB7cn0KcGJtYyA8LSBOb3JtYWxpemVEYXRhKHBibWMsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsIHNjYWxlLmZhY3RvciA9IDEwMDAwKQpgYGAKI3Byb3ZpZGVkcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwuSG93ZXZlciBtYXkgbm90IGJlIG5lZWRlZCwgYW5kIGNhbiBqdXN0IHVzZSB0aGUgZnVuY3Rpb24gYmVsb3cgCgpgYGB7cn0KI1doaWxlIHRoaXMgbWV0aG9kIG9mIG5vcm1hbGl6YXRpb24gaXMgc3RhbmRhcmQgYW5kIHdpZGVseSB1c2VkIGluIHNjUk5BLXNlcSBhbmFseXNpcywgZ2xvYmFsLXNjYWxpbmcgcmVsaWVzIG9uIGFuIGFzc3VtcHRpb24gdGhhdCBlYWNoIGNlbGwgb3JpZ2luYWxseSBjb250YWlucyB0aGUgc2FtZSBudW1iZXIgb2YgUk5BIG1vbGVjdWxlcwpwYm1jIDwtIE5vcm1hbGl6ZURhdGEocGJtYykKCmBgYApJZGVudGlmaWNhdGlvbiBvZiBoaWdobHkgdmFyaWFibGUgZmVhdHVyZXMgKGZlYXR1cmUgc2VsZWN0aW9uKQpOZXh0IGNhbGN1bGF0ZSBhIHN1YnNldCBvZiBmZWF0dXJlcyB0aGF0IGV4aGliaXQgaGlnaCBjZWxsLXRvLWNlbGwgdmFyaWF0aW9uIGluIHRoZSBkYXRhc2V0IChpLmUsIHRoZXkgYXJlIGhpZ2hseSBleHByZXNzZWQgaW4gc29tZSBjZWxscywgYW5kIGxvd2x5IGV4cHJlc3NlZCBpbiBvdGhlcnMpLiAgZ2VuZXMgaW4gZG93bnN0cmVhbSBhbmFseXNpcyBoZWxwcyB0byBoaWdobGlnaHQgYmlvbG9naWNhbCBzaWduYWwgaW4gc2luZ2xlLWNlbGwgZGF0YXNldHMuCiNtb2RlbHMgdGhlIG1lYW4gLXZhcmlhYmNlIHJlbGF0aW9uc2hpcCBpbiBzaW5nbGUgY2VsbCBkYXRhIApgYGB7cn0KcGJtYyA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhwYm1jLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCgojIElkZW50aWZ5IHRoZSAxMCBtb3N0IGhpZ2hseSB2YXJpYWJsZSBnZW5lcwp0b3AxMCA8LSBoZWFkKFZhcmlhYmxlRmVhdHVyZXMocGJtYyksIDEwKQoKIyBwbG90IHZhcmlhYmxlIGZlYXR1cmVzIHdpdGggYW5kIHdpdGhvdXQgbGFiZWxzCnBsb3QxIDwtIFZhcmlhYmxlRmVhdHVyZVBsb3QocGJtYykKcGxvdDIgPC0gTGFiZWxQb2ludHMocGxvdCA9IHBsb3QxLCBwb2ludHMgPSB0b3AxMCwgcmVwZWwgPSBUUlVFKQpwbG90MSArIHBsb3QyCmBgYAojU2NhbGluZyB0aGUgZGF0YQojTmV4dCwgd2UgYXBwbHkgYSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gKOKAmHNjYWxpbmfigJkpIHRoYXQgaXMgYSBzdGFuZGFyZCBwcmUtcHJvY2Vzc2luZyBzdGVwIHByaW9yIHRvIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiB0ZWNobmlxdWVzIGxpa2UgUENBLiBUaGUgU2NhbGVEYXRhKCkgZnVuY3Rpb246CgojU2hpZnRzIHRoZSBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZSwgc28gdGhhdCB0aGUgbWVhbiBleHByZXNzaW9uIGFjcm9zcyBjZWxscyBpcyAwCiNTY2FsZXMgdGhlIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lLCBzbyB0aGF0IHRoZSB2YXJpYW5jZSBhY3Jvc3MgY2VsbHMgaXMgMQojVGhpcyBzdGVwIGdpdmVzIGVxdWFsIHdlaWdodCBpbiBkb3duc3RyZWFtIGFuYWx5c2VzLCBzbyB0aGF0IGhpZ2hseS1leHByZXNzZWQgZ2VuZXMgZG8gbm90IGRvbWluYXRlCiNUaGUgcmVzdWx0cyBvZiB0aGlzIGFyZSBzdG9yZWQgaW4gcGJtY1tbIlJOQSJdXSRzY2FsZS5kYXRhCiNCeSBkZWZhdWx0LCBvbmx5IHZhcmlhYmxlIGZlYXR1cmVzIGFyZSBzY2FsZWQuCiNZb3UgY2FuIHNwZWNpZnkgdGhlIGZlYXR1cmVzIGFyZ3VtZW50IHRvIHNjYWxlIGFkZGl0aW9uYWwgZmVhdHVyZXMKYGBge3J9CmFsbC5nZW5lcyA8LSByb3duYW1lcyhwYm1jKQpwYm1jIDwtIFNjYWxlRGF0YShwYm1jLCBmZWF0dXJlcyA9IGFsbC5nZW5lcykKYGBgCiNQZXJmb3JtIGxpbmVhciBkaW1lbnNpb25hbCByZWR1Y3Rpb24KI05leHQgd2UgcGVyZm9ybSBQQ0Egb24gdGhlIHNjYWxlZCBkYXRhLiBCeSBkZWZhdWx0LCBvbmx5IHRoZSBwcmV2aW91c2x5IGRldGVybWluZWQgdmFyaWFibGUgZmVhdHVyZXMgYXJlIHVzZWQgYXMgaW5wdXQsIGJ1dCBjYW4gYmUgZGVmaW5lZCB1c2luZyBmZWF0dXJlcyBhcmd1bWVudCBpZiB5b3Ugd2lzaCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgc3Vic2V0IChpZiB5b3UgZG8gd2FudCB0byB1c2UgYSBjdXN0b20gc3Vic2V0IG9mIGZlYXR1cmVzLCBtYWtlIHN1cmUgeW91IHBhc3MgdGhlc2UgdG8gU2NhbGVEYXRhIGZpcnN0KS4KCiNGb3IgdGhlIGZpcnN0IHByaW5jaXBhbCBjb21wb25lbnRzLCBTZXVyYXQgb3V0cHV0cyBhIGxpc3Qgb2YgZ2VuZXMgd2l0aCB0aGUgbW9zdCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbG9hZGluZ3MsIHJlcHJlc2VudGluZyBtb2R1bGVzIG9mIGdlbmVzIHRoYXQgZXhoaWJpdCBlaXRoZXIgY29ycmVsYXRpb24gKG9yIGFudGktY29ycmVsYXRpb24pIGFjcm9zcyBzaW5nbGUtY2VsbHMgaW4gdGhlIGRhdGFzZXQuCmBgYHtyfQpwYm1jIDwtIFJ1blBDQShwYm1jLCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMob2JqZWN0ID0gcGJtYykpCmBgYAojU2V1cmF0IHByb3ZpZGVzIHNldmVyYWwgdXNlZnVsIHdheXMgb2YgdmlzdWFsaXppbmcgYm90aCBjZWxscyBhbmQgZmVhdHVyZXMgdGhhdCBkZWZpbmUgdGhlIFBDQSwgaW5jbHVkaW5nIFZpekRpbVJlZHVjdGlvbigpLCBEaW1QbG90KCksIGFuZCBEaW1IZWF0bWFwKCkKCgpgYGB7cn0KIyBFeGFtaW5lIGFuZCB2aXN1YWxpemUgUENBIHJlc3VsdHMgYSBmZXcgZGlmZmVyZW50IHdheXMKcHJpbnQocGJtY1tbInBjYSJdXSwgZGltcyA9IDE6NSwgbmZlYXR1cmVzID0gNSkKYGBgCiN3aWxsIGdlbmVyYXRlIGEgdmlzdWFsaXphdGlvbiB0aGF0IGhlbHBzIGludGVycHJldCB0aGUgY29udHJpYnV0aW9uIG9mIGRpZmZlcmVudCBnZW5lcyB0byB0aGUgdmFyaWF0aW9uIGNhcHR1cmVkIGJ5IHRoZSBmaXJzdCB0d28gcHJpbmNpcGFsIGNvbXBvbmVudHMgaW4gdGhlIHNjUk5BLXNlcSBkYXRhc2V0IHN0b3JlZCBpbiBwYm1jLiBUaGlzIHZpc3VhbGl6YXRpb24gY2FuIGJlIGhlbHBmdWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlIGFuZCBzb3VyY2VzIG9mIHZhcmlhdGlvbiBpbiB0aGUgZGF0YXNldC4KYGBge3J9ClZpekRpbUxvYWRpbmdzKHBibWMsIGRpbXMgPSAxOjIsIHJlZHVjdGlvbiA9ICJwY2EiKQoKYGBgCgpgYGB7cn0KRGltUGxvdChwYm1jLCByZWR1Y3Rpb24gPSAicGNhIikgKyBOb0xlZ2VuZCgpCmBgYAoKYGBge3J9CkRpbUhlYXRtYXAocGJtYywgZGltcyA9IDEsIGNlbGxzID0gNTAwLCBiYWxhbmNlZCA9IFRSVUUpCiNEaW1IZWF0bWFwKCkgYWxsb3dzIGZvciBlYXN5IGV4cGxvcmF0aW9uIG9mIHRoZSBwcmltYXJ5IHNvdXJjZXMgb2YgaGV0ZXJvZ2VuZWl0eSBpbiBhIGRhdGFzZXQsIGFuZCBjYW4gYmUgdXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGRlY2lkZSB3aGljaCBQQ3MgdG8gaW5jbHVkZSBmb3IgZnVydGhlciBkb3duc3RyZWFtIGFuYWx5c2VzLiBCb3RoIGNlbGxzIGFuZCBmZWF0dXJlcyBhcmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgUENBIHNjb3Jlcy4gU2V0dGluZyBjZWxscyB0byBhIG51bWJlciBwbG90cyB0aGUg4oCYZXh0cmVtZeKAmSBjZWxscyBvbiBib3RoIGVuZHMgb2YgdGhlIHNwZWN0cnVtLCB3aGljaCBkcmFtYXRpY2FsbHkgc3BlZWRzIHBsb3R0aW5nIGZvciBsYXJnZSBkYXRhc2V0cy4gCgoKYGBgCmBgYHtyfQpEaW1IZWF0bWFwKHBibWMsIGRpbXMgPSAxOjE1LCBjZWxscyA9IDUwMCwgYmFsYW5jZWQgPSBUUlVFKQoKYGBgCiNEZXRlcm1pbmUgdGhlIOKAmGRpbWVuc2lvbmFsaXR54oCZIG9mIHRoZSBkYXRhc2V0CiNUbyBvdmVyY29tZSB0aGUgZXh0ZW5zaXZlIHRlY2huaWNhbCBub2lzZSBpbiBhbnkgc2luZ2xlIGZlYXR1cmUgZm9yIHNjUk5BLXNlcSBkYXRhLCBTZXVyYXQgY2x1c3RlcnMgY2VsbHMgYmFzZWQgb24gdGhlaXIgUENBIHNjb3Jlcywgd2l0aCBlYWNoIFBDIGVzc2VudGlhbGx5IHJlcHJlc2VudGluZyBhIOKAmG1ldGFmZWF0dXJl4oCZIHRoYXQgY29tYmluZXMgaW5mb3JtYXRpb24gYWNyb3NzIGEgY29ycmVsYXRlZCBmZWF0dXJlIHNldC4KI0FuIGFsdGVybmF0aXZlIGhldXJpc3RpYyBtZXRob2QgZ2VuZXJhdGVzIGFuIOKAmEVsYm93IHBsb3TigJk6IGEgcmFua2luZyBvZiBwcmluY2lwbGUgY29tcG9uZW50cyBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBvZiB2YXJpYW5jZSBleHBsYWluZWQgYnkgZWFjaCBvbmUgKEVsYm93UGxvdCgpIGZ1bmN0aW9uKS4gSW4gdGhpcyBleGFtcGxlLCB3ZSBjYW4gb2JzZXJ2ZSBhbiDigJhlbGJvd+KAmSBhcm91bmQgUEM5LTEwLCBzdWdnZXN0aW5nIHRoYXQgdGhlIG1ham9yaXR5IG9mIHRydWUgc2lnbmFsIGlzIGNhcHR1cmVkIGluIHRoZSBmaXJzdCAxMCBQQ3MuCmBgYHtyfQpFbGJvd1Bsb3QocGJtYykKI3JhbmtlZCBieSBwYyBvbiBwZXJjZW50YWdlIG9mIHZhcmlhbmNlIApgYGAKI0NsdXN0ZXIgdGhlIGNlbGxzIAojRmluZENsdXN0ZXJzKCkgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGlzIHByb2NlZHVyZSwgYW5kIGNvbnRhaW5zIGEgcmVzb2x1dGlvbiBwYXJhbWV0ZXIgdGhhdCBzZXRzIHRoZSDigJhncmFudWxhcml0eeKAmSBvZiB0aGUgZG93bnN0cmVhbSBjbHVzdGVyaW5nLCB3aXRoIGluY3JlYXNlZCB2YWx1ZXMgbGVhZGluZyB0byBhIGdyZWF0ZXIgbnVtYmVyIG9mIGNsdXN0ZXJzLiBXZSBmaW5kIHRoYXQgc2V0dGluZyB0aGlzIHBhcmFtZXRlciBiZXR3ZWVuIDAuNC0xLjIgdHlwaWNhbGx5IHJldHVybnMgZ29vZCByZXN1bHRzIGZvciBzaW5nbGUtY2VsbCBkYXRhc2V0cyBvZiBhcm91bmQgM0sgY2VsbHMuIE9wdGltYWwgcmVzb2x1dGlvbiBvZnRlbiBpbmNyZWFzZXMgZm9yIGxhcmdlciBkYXRhc2V0cy4gVGhlIGNsdXN0ZXJzIGNhbiBiZSBmb3VuZCB1c2luZyB0aGUgSWRlbnRzKCkgZnVuY3Rpb24uCmBgYHtyfQojVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhIG5lYXJlc3QgbmVpZ2hib3IgZ3JhcGggYmFzZWQgb24gdGhlIGV4cHJlc3Npb24gdmFsdWVzIGluIHRoZSBkYXRhc2V0IHBibWMuIEl0IGNhbGN1bGF0ZXMgcGFpcndpc2UgZGlzdGFuY2VzIGJldHdlZW4gY2VsbHMgaW4gdGhlIGhpZ2gtZGltZW5zaW9uYWwgc3BhY2UgZGVmaW5lZCBieSB0aGUgZmlyc3QgMTAgcHJpbmNpcGFsIGNvbXBvbmVudHMgKGRpbXMgPSAxOjEwKQpwYm1jIDwtIEZpbmROZWlnaGJvcnMocGJtYywgZGltcyA9IDE6MTApCnBibWMgPC0gRmluZENsdXN0ZXJzKHBibWMsIHJlc29sdXRpb24gPSAwLjUpCmBgYAoKYGBge3J9CiMgTG9vayBhdCBjbHVzdGVyIElEcyBvZiB0aGUgZmlyc3QgNSBjZWxscwpoZWFkKElkZW50cyhwYm1jKSwgNSkKYGBgClJ1biBub24tbGluZWFyIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiAoVU1BUC90U05FKQpTZXVyYXQgb2ZmZXJzIHNldmVyYWwgbm9uLWxpbmVhciBkaW1lbnNpb25hbCByZWR1Y3Rpb24gdGVjaG5pcXVlcywgc3VjaCBhcyB0U05FIGFuZCBVTUFQLCB0byB2aXN1YWxpemUgYW5kIGV4cGxvcmUgdGhlc2UgZGF0YXNldHMuIFdlIGVuY291cmFnZSB1c2VycyB0byBsZXZlcmFnZSB0ZWNobmlxdWVzIGxpa2UgVU1BUCBmb3IgdmlzdWFsaXphdGlvbiwgYnV0IHRvIGF2b2lkIGRyYXdpbmcgYmlvbG9naWNhbCBjb25jbHVzaW9ucyBzb2xlbHkgb24gdGhlIGJhc2lzIG9mIHZpc3VhbGl6YXRpb24gdGVjaG5pcXVlcy4KYGBge3J9CnBibWMgPC0gUnVuVU1BUChwYm1jLCBkaW1zID0gMToxMCkKYGBgCgpgYGB7cn0KIyBub3RlIHRoYXQgeW91IGNhbiBzZXQgYGxhYmVsID0gVFJVRWAgb3IgdXNlIHRoZSBMYWJlbENsdXN0ZXJzIGZ1bmN0aW9uIHRvIGhlbHAgbGFiZWwKIyBpbmRpdmlkdWFsIGNsdXN0ZXJzCkRpbVBsb3QocGJtYywgcmVkdWN0aW9uID0gInVtYXAiKQpgYGAKCiNGaW5kaW5nIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBmZWF0dXJlcyAoY2x1c3RlciBiaW9tYXJrZXJzKQojRmluZEFsbE1hcmtlcnMoKSBhdXRvbWF0ZXMgdGhpcyBwcm9jZXNzIGZvciBhbGwgY2x1c3RlcnMsIGJ1dCB5b3UgY2FuIGFsc28gdGVzdCBncm91cHMgb2YgY2x1c3RlcnMgdnMuIGVhY2ggb3RoZXIsIG9yIGFnYWluc3QgYWxsIGNlbGxzLgoKYGBge3J9CiMgZmluZCBhbGwgbWFya2VycyBvZiBjbHVzdGVyIDIKY2x1c3RlcjIubWFya2VycyA8LSBGaW5kTWFya2VycyhwYm1jLCBpZGVudC4xID0gMikKaGVhZChjbHVzdGVyMi5tYXJrZXJzLCBuID0gNSkKYGBgCgpgYGB7cn0KIyBmaW5kIGFsbCBtYXJrZXJzIGRpc3Rpbmd1aXNoaW5nIGNsdXN0ZXIgNSBmcm9tIGNsdXN0ZXJzIDAgYW5kIDMKY2x1c3RlcjUubWFya2VycyA8LSBGaW5kTWFya2VycyhwYm1jLCBpZGVudC4xID0gNSwgaWRlbnQuMiA9IGMoMCwgMykpCmhlYWQoY2x1c3RlcjUubWFya2VycywgbiA9IDUpCmBgYAoKCmBgYHtyfQojIGZpbmQgbWFya2VycyBmb3IgZXZlcnkgY2x1c3RlciBjb21wYXJlZCB0byBhbGwgcmVtYWluaW5nIGNlbGxzLCByZXBvcnQgb25seSB0aGUgcG9zaXRpdmUKIyBvbmVzCnBibWMubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhwYm1jLCBvbmx5LnBvcyA9IFRSVUUpCnBibWMubWFya2VycyAlPiUKICAgIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogICAgZHBseXI6OmZpbHRlcihhdmdfbG9nMkZDID4gMSkKYGBgCgpgYGB7cn0KY2x1c3RlcjAubWFya2VycyA8LSBGaW5kTWFya2VycyhwYm1jLCBpZGVudC4xID0gMCwgbG9nZmMudGhyZXNob2xkID0gMC4yNSwgdGVzdC51c2UgPSAicm9jIiwgb25seS5wb3MgPSBUUlVFKQpgYGAKIyBWbG5QbG90KCkgKHNob3dzIGV4cHJlc3Npb24gcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9ucyBhY3Jvc3MgY2x1c3RlcnMpLCBhbmQgRmVhdHVyZVBsb3QoKSAodmlzdWFsaXplcyBmZWF0dXJlIGV4cHJlc3Npb24gb24gYSB0U05FIG9yIFBDQSBwbG90KSBhcmUgb3VyIG1vc3QgY29tbW9ubHkgdXNlZCB2aXN1YWxpemF0aW9ucy4gV2UgYWxzbyBzdWdnZXN0IGV4cGxvcmluZyBSaWRnZVBsb3QoKSwgQ2VsbFNjYXR0ZXIoKSwgYW5kIERvdFBsb3QoKSBhcyBhZGRpdGlvbmFsIG1ldGhvZHMgdG8gdmlldyB5b3VyIGRhdGFzZXQuCgojd2hhdHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvPyAKI1ZsblBsb3QgaXMgdXNlZCBmb3IgZXhhbWluaW5nIHRoZSBkaXN0cmlidXRpb24gb2YgZ2VuZSBleHByZXNzaW9uIHZhbHVlcyBhY3Jvc3MgY2VsbHMsIHdoaWxlIEZlYXR1cmVQbG90IGlzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBleHByZXNzaW9uIHBhdHRlcm5zIG9mIHNwZWNpZmljIGdlbmVzIHdpdGhpbiB0aGUgY29udGV4dCBvZiBjZWxsIGNsdXN0ZXJzIG9yIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBwbG90cy4KCmBgYHtyfQpWbG5QbG90KHBibWMsIGZlYXR1cmVzID0gYygiTVM0QTEiLCAiQ0Q3OUEiKSkKYGBgCiN2aW9saW4gcGxvdHMgd2lsbCBzaG93IHRoZSBkaXN0cmlidXRpb24gb2YgZXhwcmVzc2lvbiBsZXZlbHMgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMsIHByb3ZpZGluZyBpbnNpZ2h0cyBpbnRvIHRoZWlyIGV4cHJlc3Npb24gcGF0dGVybnMgYWNyb3NzIGNlbGxzIGluIHRoZSBkYXRhc2V0LgpgYGB7cn0KIyB5b3UgY2FuIHBsb3QgcmF3IGNvdW50cyBhcyB3ZWxsClZsblBsb3QocGJtYywgZmVhdHVyZXMgPSBjKCJOS0c3IiwgIlBGNCIpLCBzbG90ID0gImNvdW50cyIsIGxvZyA9IFRSVUUpCmBgYAojY3JlYXRlcyBhIGZlYXR1cmUgcGxvdCAtIHNob3dzIGRpc3RyaWJ1dGlvbiBvZiBnZW5lIGV4cHJlc3Npb24KYGBge3J9CkZlYXR1cmVQbG90KHBibWMsIGZlYXR1cmVzID0gYygiTVM0QTEiLCAiR05MWSIsICJDRDNFIiwgIkNEMTQiLCAiRkNFUjFBIiwgIkZDR1IzQSIsICJMWVoiLCAiUFBCUCIsCiAgICAiQ0Q4QSIpKQpgYGAKI0RvSGVhdG1hcCgpIGdlbmVyYXRlcyBhbiBleHByZXNzaW9uIGhlYXRtYXAgZm9yIGdpdmVuIGNlbGxzIGFuZCBmZWF0dXJlcy4gSW4gdGhpcyBjYXNlLCB3ZSBhcmUgcGxvdHRpbmcgdGhlIHRvcCAyMCBtYXJrZXJzIChvciBhbGwgbWFya2VycyBpZiBsZXNzIHRoYW4gMjApIGZvciBlYWNoIGNsdXN0ZXIuCmBgYHtyfQpwYm1jLm1hcmtlcnMgJT4lCiAgICBncm91cF9ieShjbHVzdGVyKSAlPiUKICAgIGRwbHlyOjpmaWx0ZXIoYXZnX2xvZzJGQyA+IDEpICU+JQogICAgc2xpY2VfaGVhZChuID0gMTApICU+JQogICAgdW5ncm91cCgpIC0+IHRvcDEwCkRvSGVhdG1hcChwYm1jLCBmZWF0dXJlcyA9IHRvcDEwJGdlbmUpICsgTm9MZWdlbmQoKQpgYGAKI0Fzc2lnbmluZyBjZWxsIHR5cGUgaWRlbnRpdHkgdG8gY2x1c3RlcnMKRm9ydHVuYXRlbHkgaW4gdGhlIGNhc2Ugb2YgdGhpcyBkYXRhc2V0LCB3ZSBjYW4gdXNlIGNhbm9uaWNhbCBtYXJrZXJzIHRvIGVhc2lseSBtYXRjaCB0aGUgdW5iaWFzZWQgY2x1c3RlcmluZyB0byBrbm93biBjZWxsIHR5cGVzOgpDbHVzdGVyIElECU1hcmtlcnMJQ2VsbCBUeXBlCjAJSUw3UiwgQ0NSNwlOYWl2ZSBDRDQrIFQKMQlDRDE0LCBMWVoJQ0QxNCsgTW9ubwoyCUlMN1IsIFMxMDBBNAlNZW1vcnkgQ0Q0KwozCU1TNEExCUIKNAlDRDhBCUNEOCsgVAo1CUZDR1IzQSwgTVM0QTcJRkNHUjNBKyBNb25vCjYJR05MWSwgTktHNwlOSwo3CUZDRVIxQSwgQ1NUMwlEQwo4CVBQQlAJUGxhdGVsZXQKYGBge3J9Cm5ldy5jbHVzdGVyLmlkcyA8LSBjKCJOYWl2ZSBDRDQgVCIsICJDRDE0KyBNb25vIiwgIk1lbW9yeSBDRDQgVCIsICJCIiwgIkNEOCBUIiwgIkZDR1IzQSsgTW9ubyIsCiAgICAiTksiLCAiREMiLCAiUGxhdGVsZXQiKQpuYW1lcyhuZXcuY2x1c3Rlci5pZHMpIDwtIGxldmVscyhwYm1jKQpwYm1jIDwtIFJlbmFtZUlkZW50cyhwYm1jLCBuZXcuY2x1c3Rlci5pZHMpCkRpbVBsb3QocGJtYywgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjUpICsgTm9MZWdlbmQoKQpgYGAKCiMgQ3JlYXRlcyBhIFVNQVAgcGxvdCBvZiB0aGUgcGJtYyBkYXRhc2V0IHVzaW5nIHRoZSBEaW1QbG90IGZ1bmN0aW9uLiBJdCBzcGVjaWZpZXMgVU1BUCBhcyB0aGUgcmVkdWN0aW9uIG1ldGhvZCBhbmQgYWRkcyBheGlzIGxhYmVscyBmb3IgVU1BUCAxIGFuZCBVTUFQIDIuIEFkZGl0aW9uYWxseSwgaXQgY3VzdG9taXplcyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgcGxvdCBieSBzZXR0aW5nIHRoZSBzaXplIG9mIGF4aXMgdGl0bGVzIGFuZCBsZWdlbmQgdGV4dC4KYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKcGxvdCA8LSBEaW1QbG90KHBibWMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNC41KSArIHhsYWIoIlVNQVAgMSIpICsgeWxhYigiVU1BUCAyIikgKwogICAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSArIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMTApKSkKZ2dzYXZlKGZpbGVuYW1lID0gIi4uL291dHB1dC9pbWFnZXMvcGJtYzNrX3VtYXAuanBnIiwgaGVpZ2h0ID0gNywgd2lkdGggPSAxMiwgcGxvdCA9IHBsb3QsIHF1YWxpdHkgPSA1MCkKYGBgCgo=